/**
 * 订单实体类
 * 业务层级：实体层
 * 功能说明：定义订单相关的数据结构，包括订单详情、订单状态和支付方式枚举
 * 架构关系：遵循四层架构设计，作为核心业务实体，为订单处理提供数据模型
 */
#ifndef ORDER_H
#define ORDER_H

#include <QDateTime>
#include <QVector>
#include <QMap>
#include <QVariant>

// 订单详情项
struct OrderDetail {
    int orderId;
    int productId;
    int quantity;
    double unitPrice;
    double subtotal;
    bool isDiscounted;

    OrderDetail() : orderId(0), productId(0), quantity(0),
                   unitPrice(0.0), subtotal(0.0), isDiscounted(false) {}

    OrderDetail(int oid, int pid, int qty, double price,
               double total, bool discounted)
        : orderId(oid), productId(pid), quantity(qty),
          unitPrice(price), subtotal(total), isDiscounted(discounted) {}
};

// 订单状态枚举
enum OrderStatus {
    ORDER_PENDING = 0,  // 待支付
    ORDER_PAID = 1,     // 已支付
    ORDER_COMPLETED = 2,// 已完成
    ORDER_CANCELLED = 3,// 已取消
    ORDER_REFUNDED = 4  // 已退款
};

// 支付方式枚举
enum PaymentMethod {
    PAYMENT_CASH = 1,           // 现金
    PAYMENT_WECHAT = 2,         // 微信支付
    PAYMENT_ALIPAY = 3,         // 支付宝
    PAYMENT_CARD = 4,           // 银行卡
    PAYMENT_MEMBER_BALANCE = 5  // 会员余额
};

class Order
{
public:
    Order();

    // 构造函数（用于创建新订单）
    Order(int userId, int customerId, double totalAmount,
          double discountAmount, double finalAmount,
          PaymentMethod method);

    // 构造函数（用于从数据库加载订单）
    Order(int orderId, int userId, int customerId,
          const QDateTime &orderTime, double totalAmount,
          double discountAmount, double finalAmount,
          PaymentMethod method, const QString &transactionNo,
          const QDateTime &paymentTime, OrderStatus status);

    // 获取订单ID
    int getOrderId() const;

    // 获取收银员ID
    int getUserId() const;

    // 获取会员ID
    int getCustomerId() const;

    // 获取订单时间
    QDateTime getOrderTime() const;

    // 获取订单总额
    double getTotalAmount() const;

    // 获取折扣金额
    double getDiscountAmount() const;

    // 获取实收金额
    double getFinalAmount() const;

    // 获取支付方式
    PaymentMethod getPaymentMethod() const;

    // 获取交易号
    QString getTransactionNo() const;

    // 获取支付时间
    QDateTime getPaymentTime() const;

    // 获取订单状态
    OrderStatus getStatus() const;

    // 获取订单详情列表
    QVector<OrderDetail> getOrderDetails() const;

    // 设置订单ID
    void setOrderId(int orderId);

    // 设置交易号
    void setTransactionNo(const QString &transactionNo);

    // 设置支付时间
    void setPaymentTime(const QDateTime &paymentTime);

    // 设置订单状态
    void setStatus(OrderStatus status);

    // 添加订单详情
    void addOrderDetail(int productId, int quantity,
                       double unitPrice, double subtotal,
                       bool isDiscounted);

    // 从数据库结果创建订单对象
    static Order fromDatabaseResult(const QMap<QString, QVariant> &result);

    // 转换为数据库可存储的格式
    QMap<QString, QVariant> toDatabaseFormat() const;

private:
    int m_orderId;
    int m_userId;
    int m_customerId;
    QDateTime m_orderTime;
    double m_totalAmount;
    double m_discountAmount;
    double m_finalAmount;
    PaymentMethod m_paymentMethod;
    QString m_transactionNo;
    QDateTime m_paymentTime;
    OrderStatus m_status;
    QVector<OrderDetail> m_orderDetails;
};

#endif // ORDER_H
